package com.itheima.service.impl;

import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.itheima.dto.PhoneCodeDto;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import com.itheima.service.UserService;
import com.itheima.vo.LoginVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * @author 王同学
 */
@Service
@Slf4j
public class UserServiceimpl implements UserService {

    @Resource      //调用redis注入
    private  RedisTemplate<String,String> redisTemplate;
    @Autowired
    UserMapper userMapper;
    @Override
    public boolean sendMsg(String phone) {
        //随机数生成6位数验证码
     int number = new Random().nextInt(100000)+100000;
            log.info("验证码为：{}",number);
        //这边把kv值写进去   设置验证码过期时间1小时
        redisTemplate.opsForValue().set("CODE"+phone,number+"",1L, TimeUnit.HOURS);
        //第二种过期时间设置方式，得用这个对象去点出来
       // redisTemplate.expire("", Duration.ofDays(1));

        return true;
    }

    @Override
    public LoginVO login(PhoneCodeDto phone) {
        //校验验证码
        if (phone==null|| StringUtils.isEmpty(phone.getPhone())||StringUtils.isEmpty(phone.getCode())){
            throw new RuntimeException("参数不能为空~！");
        }
        String phone1 = phone.getPhone();
        String code1 = phone.getCode();
        //从redis读取之前发送的验证码
        String s = redisTemplate.opsForValue().get("CODE" + phone1);
        //检查手机号是否存在
        if (StringUtils.isEmpty(s)){
            throw new RuntimeException("验证码为空~！");
        }
        //校验验证码
        if(!s.equals(code1)){
            throw new RuntimeException("验证码不正确~！！");
        }
        //把手机号码传进去，得到一个封装的对象
        //他是通过手机号码查询到这个对象
        User user = userMapper.selectByPhone(phone1);
        long str = System.currentTimeMillis();
        if (user==null) {
            // 不存在 创建账号，生成token，写入redis
            //组装信息，调用mapper添加一下
            //因为传进来的只有手机号码，所以我们要给他添加上别的信息
            User user1=new User();
            //必要的东西 id phone name
            user1.setId("id"+str);
            user1.setPhone(phone1);
            user1.setName("用户"+str);
            user1.setStatus(1);
            //因为设计的时候没有强制要求，所以可以直接不写其他的
            //把当前创建好的用户信息赋值到user对象中
            //重新分配 new对象
            user=new User();
            BeanUtils.copyProperties(user1,user);

            //剩下的就是开户和添加进去
            int res= userMapper.adduser(user);
            if (res!=1){
                throw new RuntimeException("新用户注册失败");
            }

        }
            //这边用的是uuid且是带有-号的
            //如果不等于空的话就给他生成token 让他可以登录
            String token ="token:"+IdUtil.randomUUID();
            //存在生成token写入redis
            //存到redis里面 先转成json形式 这样可阅读性更高,要去导依赖注入fastjson
            //这个就是kv值查询根据token找到这个对象的值，把他转换成json格式再存进去
                                                                            //设置过期时间为7天
                redisTemplate.opsForValue().set(token, JSON.toJSONString(user),7L,TimeUnit.DAYS);
                //调用vo给他封装起来
                LoginVO vo=new LoginVO();
                vo.setId(user.getId());
                vo.setStatus(user.getStatus());
                vo.setPhone(user.getPhone());
                vo.setToken(token);

                return vo;
    }
}
